package com.itheima.a03polymorphismdemo3;

public class Test2 {
    public static void main(String[] args) {
        //创建对象
        Animal a = new Dog();
        //编译看左边，运行看右边
        a.eat();

        //多态的弊端：
        //不能调用子类特有的功能
        //报错的原因？
        //当调用成员方法的时候，编译看左边，运行看右边
        //那么在编译的时候会先检查左边的父类中有没有这个方法，如果没有直接报错
        //a.lookHome();

        //解决方案：
        //变回子类类型就行了
        //细节：转换的时候不能瞎转，如果转换成其他的类型，就会报错,所以要判断
        //Cat c = (Cat) a;
        //c.catchMouse();

//        if(a instanceof Dog){
//            Dog d = (Dog) a;
//        }else if(a instanceof Cat){
//            Cat c = (Cat) a;
//        }else {
//            System.out.println("没有这个类型，转换失败");
//        }

        //新特性
        //先判断a是否为Dog类型，如果是，则强转成Dog类型，转换之后变量名为d
        //如果不是，则不强转，结果直接是false
        if(a instanceof Dog d){
            d.lookHome();
        }else if(a instanceof Cat c){
            c.catchMouse();
        }else {
            System.out.println("没有这个类型，转换失败");
        }


    }
}

class Animal{
    public void eat(){
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal{
    public void eat(){
        System.out.println("狗在吃骨头");
    }

    public void lookHome(){
        System.out.println("狗看家");
    }
}

class Cat extends Animal{
    public void eat(){
        System.out.println("猫在吃小鱼干");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}
